/*
* This file is part of Project SkyFire https://www.projectskyfire.org.
* See LICENSE.md file for Copyright information
*/

#ifndef _QUERYHOLDER_H
#define _QUERYHOLDER_H

#include <ace/Future.h>

class SQLQueryHolder
{
    friend class SQLQueryHolderTask;
private:
    typedef std::pair<SQLElementData, SQLResultSetUnion> SQLResultPair;
    std::vector<SQLResultPair> m_queries;
public:
    SQLQueryHolder() { }
    ~SQLQueryHolder();
    bool SetQuery(size_t index, const char* sql);
    bool SetPQuery(size_t index, const char* format, ...) ATTR_PRINTF(3, 4);
    bool SetPreparedQuery(size_t index, PreparedStatement* stmt);
    void SetSize(size_t size);
    QueryResult GetResult(size_t index);
    PreparedQueryResult GetPreparedResult(size_t index);
    void SetResult(size_t index, ResultSet* result);
    void SetPreparedResult(size_t index, PreparedResultSet* result);
};

typedef ACE_Future<SQLQueryHolder*> QueryResultHolderFuture;

class SQLQueryHolderTask : public SQLOperation
{
private:
    SQLQueryHolder* m_holder;
    QueryResultHolderFuture m_result;

public:
    SQLQueryHolderTask(SQLQueryHolder* holder, QueryResultHolderFuture res)
        : m_holder(holder), m_result(res) { };
    bool Execute();
};

#endif